package br.com.tcf.ManegedBeans;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import br.com.tcf.arqConfiguracoes.buildLog;
import br.com.tcf.dao.EmpresaDao;
import br.com.tcf.dao.GrupoDao;
import br.com.tcf.dao.LocalidadesDao;
import br.com.tcf.dao.UsuarioDao;
import br.com.tcf.entidades.Cidade;
import br.com.tcf.entidades.Cliente;
import br.com.tcf.entidades.Empresa;
import br.com.tcf.entidades.Estado;
import br.com.tcf.login.Grupo;
import br.com.tcf.login.Usuario;
import br.com.tcf.validacoes.CriptografaPassword;
import br.com.tcf.validacoes.ValidaCpf;

@ManagedBean(name="cadastraUsuariosMB")
@ViewScoped
public class CadastraUsuariosMB {
	private Usuario usuarioLogado;

	private Usuario usuario = new Usuario();
	private UsuarioDao dao;
	private Empresa empresa;
	private List<Empresa> empresas;
	private EmpresaDao empresaDao;
	private Cliente cliente = new Cliente();
	private Cidade cidade;
	private Estado estado;
	private List<Estado> estados;
	private LocalidadesDao localDao;
	private GrupoDao gdao;
	private Grupo grupo = new Grupo();
	private List<Grupo> grupos;
	private ValidaCpf vcpf;
	private String senha = "";
	private String confirmSenha = "";

	@ManagedProperty(value="#{controlaAcessoMB}")
	ControlaAcessoMB controlaAcessoMB;

	@PostConstruct
	public void ini(){
		System.out.println("Criado MB");
		usuarioLogado = controlaAcessoMB.getUsuario();

		if(usuarioLogado.getSn_empresa() == true){
			usuario.setSn_empresa(true);
			usuario.setEmpresa(usuarioLogado.getEmpresa());
		}else if(usuarioLogado.getNm_usuario().equals("MASTER")){
			usuario.setSn_administrador(true);
		}
		localDao = new LocalidadesDao();
		estados = new ArrayList<Estado>();
		estado = new Estado();
		cidade = new Cidade();
		
		estados = localDao.buscaEstadoToEager();
		
		carregaGrupos();
	}	

	@PreDestroy
	public void morreu() {
		System.out.println("Morreu UserMB");
	}	

	public void adicionaUsuario(){
		vcpf = new ValidaCpf();
		dao = new UsuarioDao();

		if(dao.buscaUsuarioPorCPF(usuario.getCpf()).size() > 0){
			buildLog.enviaMessagemParaTela(FacesMessage.SEVERITY_ERROR, "Erro na tentativa de criar! ", "J� existe usu�rio com esse Username!");

		}else if(vcpf.validar(usuario.getCpf())==true){
			if(!senha.equals(confirmSenha)){
				buildLog.enviaMessagemParaTela(FacesMessage.SEVERITY_ERROR, "Erro! ", "Confirma��o de Senha n�o confere!");
			}else{
				try{
					usuario.setSenha(CriptografaPassword.makePasswrod(usuario.getCpf()+senha));
					usuario.setGrupo(grupo);
					usuario.setCidade(cidade);
					usuario.setEmpresa(empresa);
					cliente.setNm_cliente(usuario.getNm_usuario());
					cliente.setCidade(cidade);
					cliente.setCpf(usuario.getCpf());
					cliente.setNr_telefone(usuario.getNr_telefone());
					usuario.setCliente(cliente);
					dao.salvar(usuario);
					buildLog.enviaMessagemParaTela(FacesMessage.SEVERITY_INFO, "Sucesso! ", "Usu�rio Adicionado com sucesso!");
					usuario = new Usuario();
					cliente = new Cliente();

				}catch(Exception e){
					e.printStackTrace();
					buildLog.enviaMessagemParaTela(FacesMessage.SEVERITY_ERROR, "Erro na tentativa de criar! ", "Procure o administrador do sistema!");
				}
			}
		}else{
			buildLog.enviaMessagemParaTela(FacesMessage.SEVERITY_ERROR, "Erro na tentativa de criar! ", "CPF Inv�lido!");
		}
	}

	public void carregaGrupos() {
		gdao = new GrupoDao();

		System.out.println("UsuarioLogado: "+usuarioLogado.getNm_usuario());
		if(usuarioLogado.getSn_administrador() == true || usuarioLogado.getNm_usuario().equals("MASTER")){
			grupos = gdao.listarGrupo();
		}else if(usuarioLogado.getSn_empresa() == true){
			grupos = gdao.listarGrupoPorEmpresa(usuario.getEmpresa());
		}
	}

	public void selecionaAdm() {
		usuario.setSn_administrador(true);
		usuario.setSn_empresa(false);
	}

	public void selecionaEmpresa() {
		usuario.setSn_empresa(true);
		usuario.setSn_administrador(false);
		
		empresaDao = new EmpresaDao();
		empresas = new ArrayList<Empresa>();
		empresa = new Empresa();
		
		empresas = empresaDao.buscaEmpresaAtiva();
	}

	//GETTERS AND SETTERS
	public Usuario getUsuario() {
		return usuario;
	}
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	public Empresa getEmpresa() {
		return empresa;
	}
	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}
	public Grupo getGrupo() {
		return grupo;
	}
	public void setGrupo(Grupo grupo) {
		this.grupo = grupo;
	}
	public List<Grupo> getGrupos() {
		return grupos;
	}
	public void setGrupos(List<Grupo> grupos) {
		this.grupos = grupos;
	}
	public Usuario getUsuarioLogado() {
		return usuarioLogado;
	}
	public void setUsuarioLogado(Usuario usuarioLogado) {
		this.usuarioLogado = usuarioLogado;
	}
	public ControlaAcessoMB getControlaAcessoMB() {
		return controlaAcessoMB;
	}
	public void setControlaAcessoMB(ControlaAcessoMB controlaAcessoMB) {
		this.controlaAcessoMB = controlaAcessoMB;
	}
	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}
	public String getConfirmSenha() {
		return confirmSenha;
	}
	public void setConfirmSenha(String confirmSenha) {
		this.confirmSenha = confirmSenha;
	}
	public List<Empresa> getEmpresas() {
		return empresas;
	}
	public void setEmpresas(List<Empresa> empresas) {
		this.empresas = empresas;
	}
	public Cidade getCidade() {
		return cidade;
	}
	public void setCidade(Cidade cidade) {
		this.cidade = cidade;
	}
	public Estado getEstado() {
		return estado;
	}
	public void setEstado(Estado estado) {
		this.estado = estado;
	}
	public List<Estado> getEstados() {
		return estados;
	}
	public void setEstados(List<Estado> estados) {
		this.estados = estados;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	
}